package com.alcj.common.utils;


import com.alcj.model.User;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

/**
 * @ClassName: CmnUtil
 * @Description: 公共方法工具类
 * @author chenxh
 * @date 2017年04月13日
 * @version V1.0
 */
public class CmnUtil {

	/**
	 * MD5加密
	 *
	 * @param inStr 加密字符
	 * @return 32位加密字符
	 */
	public static String EncodeMD5(String inStr) throws Exception {
		MessageDigest md5 = null;

		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return "";
		}

		byte[] byteArray = inStr.getBytes("UTF-8");
		byte[] md5Bytes = md5.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();

		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16) {
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}

		return hexValue.toString();
	}

	/**
	 * <b>功能：判断字符串是否为空</b>
	 *
	 * @param param
	 * @return boolean
	 * @Author:guokb , 2016年4月6日
	 */
	public static boolean isNotEmpty(String param) {
		return param != null && !param.isEmpty();
	}

	/**
	 * <b>功能：判断整型是否为空</b>
	 *
	 * @param param
	 * @return boolean
	 * @Author:guokb , 2016年4月6日
	 */
	public static boolean isNotEmpty(Integer param) {
		return param != null && param != 0;
	}

	/**
	 * <b>功能：判断list集合是否为空</b>
	 *
	 * @param list
	 * @return boolean
	 * @Author:guokb , 2016年4月6日
	 */
	public static boolean isNotEmpty(List<?> list) {
		return list != null && list.size() > 0;
	}

	/**
	 * <b>功能：判断字符串是否为空</b>
	 *
	 * @param param
	 * @return boolean
	 * @Author:guokb , 2016年4月11日
	 */
	public static boolean isEmpty(String param) {
		return param == null || param.isEmpty();
	}

	/**
	 * <b>功能：判断整型是否为空</b>
	 *
	 * @param param
	 * @return boolean
	 * @Author:guokb , 2016年4月11日
	 */
	public static boolean isEmpty(Integer param) {
		return param == null || param == 0;
	}

	/**
	 * <b>功能：判断对象是否为空</b>
	 *
	 * @param param
	 * @return boolean
	 * @Author:guokb , 2016年4月11日
	 */
	public static boolean isEmpty(Object param) {
		return param == null;
	}

	/**
	 * <b>功能：判断list集合是否为空</b>
	 *
	 * @param list
	 * @return boolean
	 * @Author:guokb , 2016年4月11日
	 */
	public static boolean isEmpty(List<?> list) {
		return list == null || list.size() == 0;
	}

	/**
	 * 字符串左补空格
	 * <p/>
	 * 该方法默认采用空格(其ASCII码为32)来左补字符
	 * 若想自己指定所补字符,可以使用
	 * <code>leftPadForByte(String str, int size, int padStrByASCII)</code>
	 * 方法
	 */
	public static String padLeftSpace(String str, int size) {
		return padLeft(str, size, 32);
	}

	/**
	 * 字符串左补零
	 * <p/>
	 * 该方法默认采用零(其ASCII码为32)来左补字符
	 * 若想自己指定所补字符,可以使用
	 * <code>leftPad(String str, int size, int padStrByASCII)</code>方法
	 */
	public static String padLeftZero(String str, int size) {
		return padLeft(str, size, 48);
	}

	/**
	 * 字符串左补字符
	 *
	 * @param padStrByASCII 该值为所补字符的ASCII码,如32表示空格,48表示0,64表示@等
	 * @size 若str对应的byte[]长度不小于size, 则按照size截取str对应的byte[], 而非原样返回str
	 */
	public static String padLeft(String str, int size, int padStrByASCII) {
		byte[] srcByte = str.getBytes();
		byte[] destByte = new byte[size];
		Arrays.fill(destByte, (byte) padStrByASCII);
		if (srcByte.length >= size) {
			System.arraycopy(srcByte, 0, destByte, 0, size);
		} else {
			System.arraycopy(srcByte, 0, destByte, size - srcByte.length, srcByte.length);
		}
		return new String(destByte);
	}

	/**
	 * 在cookie中取得用户名
	 *
	 * @param "Cookie"
	 * @return 用户名
	 */
	public static String getCookieUser(Cookie cookies[]) {

		// 获取cookie数组

		for (int i = 0; cookies != null && i < cookies.length; i++) {
			Cookie cookie = cookies[i];
			// 当cookie中用户名存在时
			if (cookie.getName().equals("ALCJUser")) {
				return cookie.getValue();
			}
		}
		return "";
	}

	/**
	 * 获取配置文件属性
	 *
	 * @param fileName    配置文件名
	 * @param protertyKey 属性键
	 * @return 属性值
	 * @throws Exception
	 */
	public static String GetPropertyValue(String fileName, String protertyKey) throws Exception {
		// 属性值
		String value = "";
		try {

			// 获取属性文件内容
			Properties properties = PropertiesLoaderUtils.loadAllProperties(fileName);
			// 根据键获取值
			value = properties.getProperty(protertyKey);

		} catch (Exception e) {
			throw e;
		}
		// 返回属性值
		return value;

	}
}
